package model

import (
	"github.com/jinzhu/gorm"
	_const "go-admin/internal/model/const"
)

// 部门
type Dept struct {
	CommonModel
	IsBanned string  `json:"isBanned"`          // 是否禁用
	Remark   string  `json:"remark"`            // 备注信息
	DeptName string  `json:"deptName"`          // 部门名称
	Sort     int64   `json:"sort"`              // 排序
	ParentId string  `json:"parentId"`          // 父级部门id
	DeptPath string  `json:"deptPath"`          // 部门路径
	Children []*Dept `json:"children" gorm:"-"` // 子级
}

// 重置表名
func (d *Dept) TableName() string {
	return "sys_dept"
}

// 获取总数
func (d *Dept) Count(db *gorm.DB) (int, error) {
	var count int
	if d.IsBanned != "" {
		db = db.Where("is_banned = ?", d.IsBanned)
	}
	if d.DeptName != "" {
		db = db.Where("dept_name LIKE ?", "%"+d.DeptName+"%")
	}
	if err := db.Model(&d).Where("is_del = ?", _const.ISDEL).Count(&count).Error; err != nil {
		return 0, err
	}
	return count, nil
}

// 创建
func (d *Dept) Create(db *gorm.DB) (string, error) {
	return d.Id, db.Create(&d).Error
}

// 获取列表
func (d *Dept) List(db *gorm.DB, pageOffset, pageSize int) ([]*Dept, error) {
	var depts []*Dept
	var err error
	db = db.Offset(pageOffset).Limit(pageSize)
	if d.IsBanned != "" {
		db = db.Where("is_banned = ?", d.IsBanned)
	}
	if d.DeptName != "" {
		db = db.Where("dept_name LIKE ?", "%"+d.DeptName+"%")
	}
	if err = db.Where("is_del = ?", _const.ISDEL).Find(&depts).Error; err != nil {
		return nil, err
	}
	return depts, nil
}

// 获取列表
func (d *Dept) ListAll(db *gorm.DB) ([]*Dept, error) {
	depts := make([]*Dept, 0)
	var err error
	if err = db.Where("is_del = ?", _const.ISDEL).Where("is_banned = ?", _const.ISBANNED).Find(&depts).Error; err != nil {
		return nil, err
	}
	return depts, nil
}

// 更新
func (d *Dept) Update(db *gorm.DB, values interface{}) error {
	if err := db.Model(&d).Updates(values).Where("id = ?", d.Id).Error; err != nil {
		return err
	}
	return nil
}

// 软删除
func (d *Dept) Delete(db *gorm.DB, values interface{}) error {
	if err := db.Model(&d).Updates(values).Where("id = ?", d.Id).Error; err != nil {
		return err
	}
	return nil
}

// 根据部门id获取部门信息
func (d *Dept) GetDeptById(db *gorm.DB, id string) (*Dept, error) {
	var dept Dept
	if err := db.Where("is_del = ?", _const.ISDEL).Where("id = ?", id).First(&dept).Error; err != nil {
		// 判断错误
		switch {
		case err == gorm.ErrRecordNotFound:
			// 说明没有找到
			return &dept, nil
		case err != nil:
			return &dept, err
		}
	}
	return &dept, nil
}

// 根据部门名称获取部门信息
func (d *Dept) GetDeptByDeptName(db *gorm.DB, deptName string) (*Dept, error) {
	var dept Dept
	if err := db.Where("is_del = ?", _const.ISDEL).Where("dept_name = ?", deptName).First(&dept).Error; err != nil {
		// 判断错误
		switch {
		case err == gorm.ErrRecordNotFound:
			// 说明没有找到
			return &dept, nil
		case err != nil:
			return &dept, err
		}
	}
	return &dept, nil
}
